package com.hyl.generator;


import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.querys.MySqlQuery;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;

import java.util.Collections;

public class GeneratorCode {
    private static String author ="hyl";//作者名称
    //生成路径
    private static String commonDir = System.getProperty("user.dir").concat("/asm-generator");//模块名称
    private static String outputDir =commonDir.concat("/src/main/java");//生成的位置
    private static String mapperDir =commonDir.concat("/src/main/resources/mapper");//生成的位置
    //连接路径,注意修改数据库名称
    private static String driver ="com.mysql.cj.jdbc.Driver";//驱动，注意版本
    private static String url ="jdbc:mysql://localhost:3306/db_authority_system?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC";
    private static String username ="root";//数据库用户名
    private static String password ="root";//数据库密码
    private static String tablePrefix ="sys_";//数据库表的前缀，如t_user
    private static String [] tables = {"sys_user","sys_role","sys_permission","sys_department"};   //生成的表
    //结构配置
    private static String parentPackage = "com.hyl";//顶级包结构=>自己的
    private static String moduleName = "auth";//模块
    private static String mapper = "mapper";//数据访问层包名称
    private static String service = "service";//业务逻辑层包名称
    private static String entity = "entity";//实体层包名称
    private static String controller = "controller";//控制器层包名称


    public static void main(String[] args) {
        // 数据库配置(DataSourceConfig)
        FastAutoGenerator.create(new DataSourceConfig.Builder(url, username, password)
                .dbQuery(new MySqlQuery()))
                // 全局配置(GlobalConfig)
                .globalConfig(builder -> {
                    builder.author(author) // 设置作者
                            .fileOverride()// 覆盖已生成文件
                            .outputDir(outputDir)
                            .build(); // 指定输出目录
                })
                // 包配置(PackageConfig)
                .packageConfig(builder -> {
                    builder.parent(parentPackage) // 设置父包名
                            .moduleName(moduleName) //模块名称
                            .mapper(mapper)
                            .entity(entity)
                            .controller(controller)
                            .service(service)
                            .pathInfo(Collections.singletonMap(OutputFile.mapperXml, mapperDir))
                            .build(); // 设置mapperXml生成路径;
                })
                .strategyConfig((scanner, builder) -> {
                    builder.entityBuilder() // 实体层操作
                            .naming(NamingStrategy.underline_to_camel) //数据库表映射到实体的命名策略.默认下划线转驼峰命名:NamingStrategy.underline_to_camel
                            .enableTableFieldAnnotation() // 开启生成实体时生成字段注解
                            .enableRemoveIsPrefix() //开启 Boolean 类型字段移除 is 前缀
                            .enableLombok(); //开启 lombok 模型

                    builder.controllerBuilder() // controller层操作
                            .enableRestStyle(); //开启生成@RestController 控制器

                    builder.mapperBuilder()
                            .enableBaseResultMap() // 启用 BaseResultMap生成
                            .enableBaseColumnList(); //启用 BaseColumnList

                    builder.addTablePrefix(tablePrefix) //增加过滤表前缀
                            .addInclude(tables);

                    builder.serviceBuilder().formatServiceFileName("%sService")// 设置生成的 service 接口命名方式，默认是 IXxxService，这里改成 XxxService
                            .build(); // 设置需要生成的表名
                })
                .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板，默认的是Velocity引擎模板
                .execute();
    }

}
